const {LinValidator, Rule} = require('../../core/V');

class BaseValidator extends LinValidator {
  constructor() {
    super();
    /** 为空数组的话 则表示此字段必填 都可以没有值*/
    this.x = [
      new Rule('isOptional', '可选的属性,emmm,这里的msg永远用不到,因为不会报错'),
      new Rule('isLength', '密码至少2个字符', {min: 2})]
  }
}

class PositiveIntegerValidator extends BaseValidator {
  constructor() {
    super();
    this.id = [
      /*
        当校验规则为isOptional时,第三个参数为可选参数没有从前端传递过来时的默认值(可选)
        当参数没有从前端传递过来时,该字段后续的规则不会对该字段进行校验(反之则会,但不会对我们手动设置的默认值进行校验)
      */
      new Rule('isOptional', '可选的属性,emmm,这里的msg永远用不到,因为不会报错', '自定义的默认值a')
      , new Rule('isInt', '需要是正整数', {min: 1})
    ];
    this.password1 = [
      new Rule('isLength', '密码至少1个字符,最多32个字符', {
        min: 1
        , max: 32
      })
    ];
    this.password2 = this.password1;
  }

  // 自定义校验 一般应用于多个字段联合校验
  validateUserDefine(vals/*包含path、query、header、body*/) {
    console.log('validateUserDefine');
    const psw1 = vals.body.password1;
    const psw2 = vals.body.password2;
    if (psw1 !== psw2) {
      throw new Error('两个密码必须相同'); // 不需要抛出ParameterException LinValidator内部会将所有异常汇聚到一起 最终抛出一个特定的ParameterException
    }
  }

  async validateAsync(vals) {
    console.log('validateAsync');
    await new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
      }, 1000)
    });
    // throw new Error('异步校验出错')
  }
}

module.exports = {
  PositiveIntegerValidator
};
